#ifndef DTU_WEB_H
#define DTU_WEB_H

#include "dtu_common.h"

/* HTTP方法枚举 */
typedef enum {
    HTTP_METHOD_GET = 0,
    HTTP_METHOD_POST = 1,
    HTTP_METHOD_PUT = 2,
    HTTP_METHOD_DELETE = 3,
    HTTP_METHOD_OPTIONS = 4
} http_method_t;

/* HTTP状态码枚举 */
typedef enum {
    HTTP_STATUS_OK = 200,
    HTTP_STATUS_CREATED = 201,
    HTTP_STATUS_NO_CONTENT = 204,
    HTTP_STATUS_BAD_REQUEST = 400,
    HTTP_STATUS_UNAUTHORIZED = 401,
    HTTP_STATUS_FORBIDDEN = 403,
    HTTP_STATUS_NOT_FOUND = 404,
    HTTP_STATUS_METHOD_NOT_ALLOWED = 405,
    HTTP_STATUS_INTERNAL_ERROR = 500,
    HTTP_STATUS_NOT_IMPLEMENTED = 501,
    HTTP_STATUS_SERVICE_UNAVAILABLE = 503
} http_status_t;

/* HTTP请求结构 */
typedef struct {
    http_method_t method;      /* HTTP方法 */
    char uri[256];            /* 请求URI */
    char query_string[512];   /* 查询字符串 */
    char headers[2048];       /* 请求头 */
    char body[4096];          /* 请求体 */
    size_t body_length;       /* 请求体长度 */
    char client_ip[16];       /* 客户端IP */
    int client_port;          /* 客户端端口 */
} http_request_t;

/* HTTP响应结构 */
typedef struct {
    http_status_t status;     /* 状态码 */
    char headers[1024];       /* 响应头 */
    char body[8192];          /* 响应体 */
    size_t body_length;       /* 响应体长度 */
    char content_type[64];    /* 内容类型 */
} http_response_t;

/* HTTP处理器函数类型 */
typedef dtu_error_t (*http_handler_t)(const http_request_t* request, http_response_t* response, void* user_data);

/* 路由项结构 */
typedef struct route_item {
    char path[128];           /* 路径模式 */
    http_method_t method;     /* HTTP方法 */
    http_handler_t handler;   /* 处理函数 */
    void* user_data;          /* 用户数据 */
    struct route_item* next;  /* 下一个路由项 */
} route_item_t;

/* 会话信息结构 */
typedef struct session {
    char session_id[64];      /* 会话ID */
    char username[32];        /* 用户名 */
    time_t create_time;       /* 创建时间 */
    time_t last_access;       /* 最后访问时间 */
    int timeout;              /* 超时时间(秒) */
    bool authenticated;       /* 是否已认证 */
    struct session* next;     /* 下一个会话 */
} session_t;

/* Web服务器配置结构 */
typedef struct {
    int port;                 /* 监听端口 */
    char bind_address[16];    /* 绑定地址 */
    int max_connections;      /* 最大连接数 */
    int timeout;              /* 连接超时时间 */
    bool enable_auth;         /* 启用认证 */
    char username[32];        /* 用户名 */
    char password[64];        /* 密码 */
    int session_timeout;      /* 会话超时时间 */
    char document_root[256];  /* 文档根目录 */
    bool enable_ssl;          /* 启用SSL */
    char ssl_cert[256];       /* SSL证书文件 */
    char ssl_key[256];        /* SSL私钥文件 */
} web_config_t;

/* Web服务器结构 */
typedef struct {
    web_config_t config;      /* 服务器配置 */
    int server_socket;        /* 服务器套接字 */
    pthread_t server_thread;  /* 服务器线程 */
    route_item_t* routes;     /* 路由链表 */
    session_t* sessions;      /* 会话链表 */
    pthread_mutex_t mutex;    /* 互斥锁 */
    bool initialized;         /* 初始化标志 */
    bool running;             /* 运行状态 */
    uint32_t request_count;   /* 请求计数 */
    uint32_t error_count;     /* 错误计数 */
} web_server_t;

/* 函数声明 */

/**
 * @brief 初始化Web服务器
 * @param config 服务器配置，NULL使用默认配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_init(const web_config_t* config);

/**
 * @brief 销毁Web服务器
 */
void dtu_web_cleanup(void);

/**
 * @brief 启动Web服务器
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_start(void);

/**
 * @brief 停止Web服务器
 */
void dtu_web_stop(void);

/**
 * @brief 注册路由处理器
 * @param path 路径模式
 * @param method HTTP方法
 * @param handler 处理函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_register_handler(const char* path, http_method_t method, 
                                     http_handler_t handler, void* user_data);

/**
 * @brief 注销路由处理器
 * @param path 路径模式
 * @param method HTTP方法
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_unregister_handler(const char* path, http_method_t method);

/**
 * @brief 设置响应状态码
 * @param response 响应结构
 * @param status 状态码
 */
void dtu_web_set_status(http_response_t* response, http_status_t status);

/**
 * @brief 设置响应头
 * @param response 响应结构
 * @param name 头名称
 * @param value 头值
 */
void dtu_web_set_header(http_response_t* response, const char* name, const char* value);

/**
 * @brief 设置响应内容类型
 * @param response 响应结构
 * @param content_type 内容类型
 */
void dtu_web_set_content_type(http_response_t* response, const char* content_type);

/**
 * @brief 设置响应体
 * @param response 响应结构
 * @param body 响应体内容
 * @param length 内容长度
 */
void dtu_web_set_body(http_response_t* response, const char* body, size_t length);

/**
 * @brief 设置JSON响应
 * @param response 响应结构
 * @param json_str JSON字符串
 */
void dtu_web_set_json_response(http_response_t* response, const char* json_str);

/**
 * @brief 设置错误响应
 * @param response 响应结构
 * @param status 状态码
 * @param message 错误消息
 */
void dtu_web_set_error_response(http_response_t* response, http_status_t status, const char* message);

/**
 * @brief 获取请求参数
 * @param request 请求结构
 * @param name 参数名
 * @param value 输出参数值
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_get_param(const http_request_t* request, const char* name, char* value, size_t size);

/**
 * @brief 获取请求头
 * @param request 请求结构
 * @param name 头名称
 * @param value 输出头值
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_get_header(const http_request_t* request, const char* name, char* value, size_t size);

/**
 * @brief 解析JSON请求体
 * @param request 请求结构
 * @param key JSON键
 * @param value 输出值
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_parse_json(const http_request_t* request, const char* key, char* value, size_t size);

/**
 * @brief 创建会话
 * @param username 用户名
 * @return 会话ID，失败返回NULL
 */
char* dtu_web_create_session(const char* username);

/**
 * @brief 验证会话
 * @param session_id 会话ID
 * @return true 有效，false 无效
 */
bool dtu_web_validate_session(const char* session_id);

/**
 * @brief 销毁会话
 * @param session_id 会话ID
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_destroy_session(const char* session_id);

/**
 * @brief 获取会话信息
 * @param session_id 会话ID
 * @param session 输出会话信息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_get_session(const char* session_id, session_t* session);

/**
 * @brief 验证用户认证
 * @param username 用户名
 * @param password 密码
 * @return true 认证成功，false 认证失败
 */
bool dtu_web_authenticate(const char* username, const char* password);

/**
 * @brief 检查请求是否已认证
 * @param request 请求结构
 * @return true 已认证，false 未认证
 */
bool dtu_web_is_authenticated(const http_request_t* request);

/**
 * @brief 获取服务器统计信息
 * @param request_count 输出请求计数
 * @param error_count 输出错误计数
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_get_stats(uint32_t* request_count, uint32_t* error_count);

/**
 * @brief 重置服务器统计信息
 */
void dtu_web_reset_stats(void);

/**
 * @brief 获取HTTP方法字符串
 * @param method HTTP方法
 * @return 方法字符串
 */
const char* dtu_web_method_string(http_method_t method);

/**
 * @brief 从字符串解析HTTP方法
 * @param str 方法字符串
 * @return HTTP方法
 */
http_method_t dtu_web_method_from_string(const char* str);

/**
 * @brief 获取HTTP状态码描述
 * @param status 状态码
 * @return 状态描述
 */
const char* dtu_web_status_string(http_status_t status);

/**
 * @brief URL编码
 * @param src 源字符串
 * @param dst 目标缓冲区
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_url_encode(const char* src, char* dst, size_t size);

/**
 * @brief URL解码
 * @param src 源字符串
 * @param dst 目标缓冲区
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_web_url_decode(const char* src, char* dst, size_t size);

#endif /* DTU_WEB_H */
